#include "userMain.h"
#include "userLedDriver.h"

void userLedInitFunc(void)
{
    GPIO_InitTypeDef        GPIO_InitStructure;
	/* GPIOA Periph clock enable */
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOF, ENABLE);
	
	/* Configure PF0 and PF1 in output pushpull mode */
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
	GPIO_Init(GPIOF, &GPIO_InitStructure);
        
    GPIO_ResetBits(GPIOF,(GPIO_Pin_0 | GPIO_Pin_1));

    /* GPIOA Periph clock enable */
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
	
	/* Configure PA3, PA4, PA5, PA6, PA7, PA8 in output pushpull mode */
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
        
    GPIO_ResetBits(GPIOA,(GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7));

    /* GPIOA Periph clock enable */
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
	
	/* Configure PB0 and PB1 in output pushpull mode */
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_3;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
        
    GPIO_ResetBits(GPIOB,(GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_3));
}

void userLedSelfTest(void)
{
    LED1_POWER_B_ON;
    userBeepOnFunc();
    LED_DELAY;
    LED1_POWER_B_OFF;LED2_LINK_B_ON;
    userBeepOffFunc();
    LED_DELAY;
    LED2_LINK_B_OFF;LED3_MESH_B_ON;
    LED_DELAY;
    LED3_MESH_B_OFF;LED4_CLOUD_B_ON;
    LED_DELAY;
    LED4_CLOUD_B_OFF;LED5_IR_B_ON;
    LED_DELAY;
    LED5_IR_B_OFF;
    LED_DELAY;

    LED1_POWER_B_ON;LED2_LINK_B_ON;LED3_MESH_B_ON;LED4_CLOUD_B_ON;LED5_IR_B_ON;
    LED_DELAY;
    LED1_POWER_B_OFF;LED2_LINK_B_OFF;LED3_MESH_B_OFF;LED4_CLOUD_B_OFF;LED5_IR_B_OFF;
    LED_DELAY;
    
    LED1_POWER_Y_ON;
    LED_DELAY;
    LED1_POWER_Y_OFF;LED2_LINK_Y_ON;
    LED_DELAY;
    LED2_LINK_Y_OFF;LED3_MESH_Y_ON;
    LED_DELAY;
    LED3_MESH_Y_OFF;LED4_CLOUD_Y_ON;
    LED_DELAY;
    LED4_CLOUD_Y_OFF;LED5_IR_Y_ON;
    LED_DELAY;
    LED5_IR_Y_OFF;
    LED_DELAY;

    LED1_POWER_Y_ON;LED2_LINK_Y_ON;LED3_MESH_Y_ON;LED4_CLOUD_Y_ON;LED5_IR_Y_ON;
    LED_DELAY;
    LED1_POWER_Y_OFF;LED2_LINK_Y_OFF;LED3_MESH_Y_OFF;LED4_CLOUD_Y_OFF;LED5_IR_Y_OFF;
    userBeepOnFunc();
    LED_DELAY;
    userBeepOffFunc();
    LED_DELAY;
    userBeepOnFunc();
    LED_DELAY;
    userBeepOffFunc();
}

uint8_t userLedState = 0;
uint8_t userLedBlinkFlag = 0;
uint8_t userLedStatePre;
uint8_t userBlinkLed5Cnt;
void userLedCtrlFunc(uint8_t userLedIndex)
{
    switch(userLedIndex)
    {
        case 0x01:
        {
            LED1_POWER_B_ON;
            LED1_POWER_Y_OFF;
            userLedState &= 0xFC;
            userLedState |= 0x01;
            userLedBlinkFlag &= 0xfc;
            break;
        }
        case 0x02:
        {
            LED1_POWER_Y_ON;
            LED1_POWER_B_OFF;
            userLedState &= 0xFC;
            userLedState |= 0x02;
            userLedBlinkFlag &= 0xfc;
            break;
        }
        case 0x03:
        {
            userLedBlinkFlag |= 0x03;
            break;
        }
        case 0x04:
        {
            userLedBlinkFlag &= 0xF3;
            userLedBlinkFlag |= 0x04;
            break;
        }
        case 0x05:
        {
            LED2_LINK_B_ON;
            LED2_LINK_Y_OFF;
            userLedState &= 0xF3;
            userLedState |= 0x04;
            userLedBlinkFlag &= 0xf3;
            break;
        }
        case 0x06:
        {
            userLedBlinkFlag &= 0xF3;
            userLedBlinkFlag |= 0x08;
            break;
        }
        case 0x07:
        {
            LED2_LINK_Y_ON;
            LED2_LINK_B_OFF;
            userLedState &= 0xF3;
            userLedState |= 0x08;
            userLedBlinkFlag &= 0xf3;
            break;
        }
        case 0x08:
        {
            LED4_CLOUD_Y_ON;
            LED4_CLOUD_B_OFF;
            userLedBlinkFlag &= 0xCF;
            userLedState &= 0xCF;
            userLedState |= 0x20;
            break;
        }
        case 0x09:
        {
            userLedBlinkFlag &= 0xCF;
            userLedBlinkFlag |= 0x20;
            break;
        }
        case 0x0a:
        {
            LED4_CLOUD_B_ON;
            LED4_CLOUD_Y_OFF;
            userLedBlinkFlag &= 0xCF;
            userLedState &= 0xCF;
            userLedState |= 0x10;
            break;
        }
        case 0x0b:
        {
            userLedBlinkFlag &= 0xCF;
            userLedBlinkFlag |= 0x10;
            break;
        }
        case 0x0c:
        {
            LED5_IR_Y_ON;
            LED5_IR_B_OFF;
            userLedBlinkFlag &= 0x3f;
            userLedState &= 0x3F;
            userLedState |= 0x80;
            break;
        }
        case 0x0d:
        {
            userLedBlinkFlag &= 0x3F;
            userLedBlinkFlag |= 0x80;
            userBlinkLed5Cnt = 6;
            userLedStatePre = userLedState;
            break;
        }
        case 0x0e:
        {
            LED5_IR_B_ON;
            LED5_IR_Y_OFF;
            userLedBlinkFlag &= 0x3f;
            userLedState &= 0x3F;
            userLedState |= 0x40;
            break;
        }
        default:
        {
            break;
        }
    }
}
#define     BLINK_FAST_TIME     10
#define     BLINK_SLOW_TIME     60
uint8_t userLed1BlinkCnt;
void userLed1BlinkTick(void)
{
    if(userLedBlinkFlag & 0x03)
    {
        if(userLed1BlinkCnt)
          userLed1BlinkCnt--;
    }
}

uint8_t userLed2BlinkCnt;
void userLed2BlinkTick(void)
{
    if(userLedBlinkFlag & 0x0C)
    {
        if(userLed2BlinkCnt)
          userLed2BlinkCnt--;
    }
}

uint8_t userLed4BlinkCnt;
void userLed4BlinkTick(void)
{
    if(userLedBlinkFlag & 0x30)
    {
        if(userLed4BlinkCnt)
          userLed4BlinkCnt--;
    }
}

uint8_t userLed5BlinkCnt;
void userLed5BlinkTick(void)
{
    if(userLedBlinkFlag & 0xC0)
    {
        if(userLed5BlinkCnt)
        userLed5BlinkCnt--;
    }
}

void userLed1Blink(void)
{
    uint8_t userValA,userValB;
    if(userLed1BlinkCnt)return;
    userLed1BlinkCnt = BLINK_SLOW_TIME;
    userValA = userLedBlinkFlag & 0x03;
    if(userValA == 0x03)
    {
        userValB = userLedState & 0x03;
        if(userValB==0x01)
        {
            userLedState &= 0xFC;
            userLedState |= 0x02;
            LED1_POWER_Y_ON;
            LED1_POWER_B_OFF;
        }
        else
        {
            userLedState &= 0xFC;
            userLedState |= 0x01;
            LED1_POWER_B_ON;
            LED1_POWER_Y_OFF;
        }
    }
}

void userLed2Blink(void)
{
    uint8_t userValA,userValB;
    if(userLed2BlinkCnt)return;
    userLed2BlinkCnt = BLINK_SLOW_TIME;
    userValA = userLedBlinkFlag & 0x0C;
    if(userValA == 0x04)
    {
        LED2_LINK_Y_OFF;
        userValB = userLedState & 0x04;
        if(userValB)
        {
            userLedState &= 0xFB;
            LED2_LINK_B_OFF;
        }
        else
        {
            userLedState |= 0x04;
            LED2_LINK_B_ON;
        }
    }
    if(userValA == 0x08)
    {
        LED2_LINK_B_OFF;
        userValB = userLedState & 0x08;
        if(userValB)
        {
            userLedState &= 0xF7;
            LED2_LINK_Y_OFF;
        }
        else
        {
            userLedState |= 0x08;
            LED2_LINK_Y_ON;
        }
    }
}
void userLed4Blink(void)
{
    uint8_t userValA,userValB;
    if(userLed4BlinkCnt)return;
    userLed4BlinkCnt = BLINK_SLOW_TIME;
    userValA = userLedBlinkFlag & 0x30;
    if(userValA == 0x10)
    {
        LED4_CLOUD_Y_OFF;
        userValB = userLedState & 0x10;
        if(userValB)
        {
            userLedState &= 0xEF;
            LED4_CLOUD_B_OFF;
        }
        else
        {
            userLedState |= 0x10;
            LED4_CLOUD_B_ON;
        }
    }
    if(userValA == 0x20)
    {
        LED4_CLOUD_B_OFF;
        userValB = userLedState & 0x20;
        if(userValB)
        {
            userLedState &= 0xDF;
            LED4_CLOUD_Y_OFF;
        }
        else
        {
            userLedState |= 0x20;
            LED4_CLOUD_Y_ON;
        }
    }
}

void userLed5Blink(void)
{
    uint8_t userValA,userValB;
    if(userLed5BlinkCnt)return;
    if(userBlinkLed5Cnt)
    {
        userBlinkLed5Cnt--;
    }
    else
    {
        if(userLedStatePre & 0x80)
        {
            LED5_IR_B_ON;
        }
        else
        {
            LED5_IR_B_OFF;
        }
        if(userLedStatePre & 0x40)
        {
            LED5_IR_Y_ON;
        }
        else
        {
            LED5_IR_Y_OFF;
        }
        userLedState |= userLedStatePre & 0xC0;
        userLedBlinkFlag &= 0x3f;
        return ;
    }
    userLed5BlinkCnt = BLINK_FAST_TIME;
    userValA = userLedBlinkFlag & 0xC0;
    if(userValA == 0x80)
    {
        LED5_IR_B_OFF;
        userValB = userLedState & 0x80;
        if(userValB)
        {
            userLedState &= 0x7F;
            LED5_IR_Y_OFF;
        }
        else
        {
            userLedState |= 0x80;
            LED5_IR_Y_ON;
        }
    }
}


void userLedBlink(void)
{
    if(userLedBlinkFlag == 0x00)
        return ;
    if(userLedBlinkFlag & 0x03)//LED1_POWER 
        userLed1Blink();
    if(userLedBlinkFlag & 0x0C)//LED2_LINK
        userLed2Blink();
    if(userLedBlinkFlag & 0x30)//LED4_CLOUD
        userLed4Blink();
    if(userLedBlinkFlag & 0xC0)//LED4_CLOUD
        userLed5Blink();
}

